home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / uxpatch / uxpatch.doc < prev    next >
Encoding:
Text File  |  1993-07-08  |  6.6 KB  |  125 lines

  1. BASICコンパイラによって作られた実行プログラムにパッチを当てて、UXで動
  2. くようにするプログラム:UXPATCH.EXE Ver.1.00  By Jouji
  3.  
  4. ◆プログラム概要
  5.  このプログラムは、BASICコンパイラV1.1L21でコンパイルした実行プ
  6. ログラム*.EXPにパッチを当てて、UXで動くようにするものです。
  7.  私はFM-TOWNS UX20のユーザーですが、現在UXのユーザーは結構多
  8. いのではないでしょうか。UXのユーザーの方はご存知でしょうが、UXではBAS
  9. ICコンパイラV1.1L21でコンパイルした*.EXPのプログラムが動きませ
  10. ん。フリコレ3~5にはこのようなプログラムが結構あって、起動しようとしたら画
  11. 面が真っ暗になってそのままハングアップという経験をお持ちの方もたくさんいらっ
  12. しゃることと思います。L21Dで再コンパイルしていただければ動くようになるの
  13. ですが、L21D版が出ないものも結構あるようです。
  14.  自分のマシンで動かないプログラムがあるということは気になるものです。Oh!
  15. FM-TOWNSによるとプログラムの起動時に数値演算コプロセッサ387の識別
  16. に失敗してハングアップしているということです。それならプログラムにパッチを当
  17. てて、387の識別の所を強制的に387無し(UXでは387は付けられないので)
  18. としてしまえばよいのではないかと考えた訳です。しかし、*.EXPプログラムの
  19. 解析をしようにも386対応のデバッガが無い!仕方がないのでSYMDEB.EX
  20. Eを使ってみました。そしたら、もう大変。オペランドのサイズが2バイトと4バイ
  21. トというように違うので、これを解析するのには気の遠くなるような手間がかかりそ
  22. うです。そこで一念発起、386用逆アセンブラまで作ってしまいました。それを使
  23. って解析した結果によってこのパッチ当てプログラムができたわけです。
  24.  
  25.  
  26. ◆起動方法
  27.  プログラムはLSIC-86試食版によってコンパイルされており、MS-DOS
  28. 汎用です。T-OSのコマンドモードあるいはMS-DOSのコマンドラインから次
  29. のようにして起動してください。
  30.  
  31.   uxpatch File_name
  32.  
  33.  対象のファイル名はLSIC-86のワイルドカード展開機能に合致するワイルド
  34. カード文字が使用できます。ワイルドカードにマッチする全てのファイルに対して順
  35. 番に処理を行います。実行例を示します。
  36.  
  37.   I:\USR>uxpatch *.exp
  38.   D_RIDER1.EXP: 書き換えました。
  39.   D_RIDER2.EXP: 書き換えました。
  40.  
  41.  なお、蛇足とは思いますがCD-ROMのファイルは書き換えられませんから、ハ
  42. ードディスク等にコピーしてから書き換えてください。また、ファイルにリードオン
  43. リー属性が付与されている場合は、フリコレ5のATTRIB.EXP等により属性
  44. を解除するか、COPYコマンドによりコピーして属性を解除してから書き換えてく
  45. ださい。リードオンリー属性が付いている場合、および、既に書き換えているファイ
  46. ルの場合は次のように表示します。
  47.  
  48.   I:\USR>uxpatch *.exp
  49.        BOM.EXP: 読み書きモードでオープンできません。
  50.   D_RIDER1.EXP: データが違います。[90]
  51.   D_RIDER2.EXP: データが違います。[90]
  52.  
  53.  実行プログラムがBASICコンパイラV1.1L21でコンパイルされたもので
  54. あるかどうかは、フリコレ5のTUGI.EXP等によってオフセット0x0200
  55. 以降の16進ダンプデータを見てみればすぐに分かります。確認してから書き換えた
  56. 方が安全です。(他のプログラムを書き換えることは、確率的にまずありえないと思
  57. いますが。) また、フリコレ5のLZEXP.EXPにより圧縮されているファイ
  58. ルもダンプしてみるとバージョンは分かります。これはLZEXP.EXPによって
  59. 元に戻してから書き換えてください。(フリコレ4のPACKEXP.EXPで圧縮
  60. されたものは、元に戻せないのでしょうか?)
  61.  
  62.  
  63. ◆動作
  64.  BASICコンパイラV1.1L21でコンパイルされた実行プログラムの数値演
  65. 算コプロセッサ387識別ルーチンは次のようになっています。
  66.  
  67. _00000000: xorl    %edx,%edx                        #33 D2
  68. _00000002: movl    %cr0,%eax                        #0F 20 C0
  69. _00000005: opsize                                   #66
  70. _00000006: testw   $0x0004,%ax                      #A9 04 00
  71. _00000009: jne     _00000012                        #75 07
  72. _0000000b: opsize                                   #66
  73. _0000000c: testw   $0x0010,%ax                      #A9 10 00
  74. _0000000f: je      _00000012                        #74 01
  75. _00000011: decl    %edx                             #4A
  76. _00000012: movl    %edx,0x0002254c                  #89 15 4C 25 02 00
  77. _00000018: ret                                      #C3
  78.  
  79. このプログラムUXPATCH.EXEは、このデータ列を探して _00000011: のデ
  80. ータを 0x90 (nop) に書き換えます。対象ファイルを読み書きモードでオープンして
  81. 直接書き換えていますから注意してください。必要ならばバックアップを取っておい
  82. てください。書き換えデータは1バイトだけであり、また、データ列が見つからない
  83. 場合は書き換えません。
  84.  
  85.  
  86. ◆謎のCR0レジスタ
  87.  UXPATCH.EXEによってほとんどのプログラムが私のUXで動くようにな
  88. り、とても満足でした。しかし、通勤電車の中でふと思い付いたのです。CR0レジ
  89. スタの内容をちゃんと設定すればこんなパッチなど不要ではないか、そして、CD-
  90. ROMから普通に起動できるようになるのではないかと。そもそも、上の387識別
  91. ルーチンで調べているCR0レジスタのbit(31)…bit(0)の中のbit
  92. (4)は、386DXではリセット時に387の有無によって自動的にセットされる
  93. はずです。それが386SXでは、なぜか正常な値になっていないのです。上の識別
  94. ルーチンでは、CR0のbit(4)==0またはbit(2)==1ならば387
  95. 無しと判定しています。CR0をこのように設定できればパッチ当ては不要となるわ
  96. けです。
  97.  そこで、CR0レジスタの内容を表示するプログラムと内容を変更するプログラム
  98. を作って調査してみました。プロテクトモードで調査すると、確かに387もないの
  99. にbit(4)==1となっており、bit(2)==0となっていて、上の識別ル
  100. ーチンでは387有りと判定されてしまいます。そこで、これらのビットを反転させ
  101. てみようとしました。ところがbit(4)は変更しようとしても変更できません(
  102. 回路が接続されていない?)。bit(2)は一応変更できるのですが、プログラム
  103. を終了するとまた元に戻ってしまいます。どうも、RUN386.EXEが再設定し
  104. てしまうようです。
  105.  つぎに、リアルモードでも同じようなプログラムを作って調査しました。リアルモ
  106. ードでも同様にbit(4)は変更できず、bit(2)は変更できます。今度はR
  107. UN386.EXEが関与していないので値も保存されています。しかし、bit
  108. (2)==1の状態でRUN386.EXEから*.EXPプログラムを起動すると
  109. 不法な割り込み2が発生してハングアップしてしまいました。
  110.  たぶん、386SXではコストダウンのために387の自動識別回路が削除されて
  111. いるのではないかと思います。それにともなってCR0のbit(4)も1に固定さ
  112. れてしまったのではないでしょうか。bit(2)はRUN386.EXEが再設定
  113. してしまうようですし、やはりパッチ当てしか無いようですね。(RUN386.E
  114. XEにパッチ当てするという手もありますが。)
  115.  
  116.  
  117. ◆著作権
  118.  Cのソースコードについては完全にフリーとします。改良、改造も可です。実行プ
  119. ログラムについてはLSIC-86試食版の配布条件に従ってください。(手数料以
  120. 上の金銭の授受は禁じられている。)
  121.  
  122.  
  123. ◆私が参考にした文献
  124. 南宗宏「32ビットマイクロプロセッサ入門」CQ出版社
  125.